﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using KPIS.GERP.GBMS.APP_UI.Common;
using KPIS.GERP.GBMS.BLL;
using KPIS.GERP.GBMS.IBLL;
using KPIS.GERP.GBMS.MODEL;
using Telerik.Web.UI;

namespace KPIS.GERP.GBMS.APP_UI.Form
{
    public partial class BGM_Expense : System.Web.UI.Page
    {
        IExpenseBLL expCtrl = new ExpenseBLL();
        Expense_BLL exp = new Expense_BLL();
        IExpenseGroupBLL expGrpCtrl = new ExpenseGroupBLL();
        CommandControl cmdFac = new CommandControl();
        ComboBLL comboBLL = new ComboBLL();
        private string expType;
        public RadTreeView tParent;
        public RadComboBox parentCombo;
        Main main = new Main();

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                LoadTree();
                LoadDDLExpenseGroupReal();
                chkInv_CheckedChanged(null, null);
            }
        }

        private void LoadDataGrid()
        {
            LoadDataGrid("");
        }

        private void LoadTree()
        {
            tView.DataSource = exp.TreeView();
            tView.DataBind();

            if (ViewState["NodeValue"] != null)
            {
                foreach (RadTreeNode node in tView.Nodes)
                {
                    SearchTree(node, ViewState["NodeValue"].ToString());
                }
            }
        }

        private void SearchTree(RadTreeNode _node, string strValue)
        {
            if (_node.Value == strValue)
            {
                _node.Selected = true;
                _node.ExpandParentNodes();
                _node.Focus();
                tView_NodeClick(tView, new RadTreeNodeEventArgs(_node));
                return;
            }

            foreach (RadTreeNode node in _node.Nodes)
            {
                SearchTree(node, strValue);
            }
        }

        private void LoadDataGrid(string seq)
        {
            Grid.DataSource = expCtrl.Search(seq, expType);
            Grid.DataBind();
            Session["dtEx"] = Grid.DataSource;
        }

        private void LoadDDLExpenseGroupReal()
        {
            ddlBgmExpGrpSeqReal.DataSource = comboBLL.ListExpenseGroup();
            ddlBgmExpGrpSeqReal.DataBind();
        }

        private void ChangeMode(Main.EditMode mode)
        {
            switch (mode)
            {
                case Main.EditMode.AddNew :
                    panelList.Visible = true;
                    panelGrid.Visible = false;

                    AddNew.Visible = false;
                    Delete.Visible = false;
                    Save_AddNew.Visible = true;
                    Save_Edit.Visible = false;
                    Cancel.Visible = true;
                    break;
                case Main.EditMode.Edit :
                    panelList.Visible = true;
                    panelGrid.Visible = false;

                    AddNew.Visible = false;
                    Delete.Visible = true;
                    Save_AddNew.Visible = false;
                    Save_Edit.Visible = true;
                    Cancel.Visible = true;
                    break;
                case Main.EditMode.View :
                    panelList.Visible = false;
                    panelGrid.Visible = true;

                    AddNew.Visible = true;
                    Delete.Visible = true;
                    Save_AddNew.Visible = false;
                    Save_Edit.Visible = false;
                    Cancel.Visible = false;
                    break;
            }
        }

        protected void Save_AddNew_Click(object sender, EventArgs e)
        {
            if (hdExpGrpSeq.Text.Length > 0 && hdLevel.Text.Length > 0 && ddlBgmExpGrpSeqReal.SelectedValue.Length > 0)
            {
                string parent = (hdSeqParent.Text.Length > 0) ? hdSeqParent.Text : "";
                string strIcmResourceType = null;
                string strIcmResourceSeq = null;

                if (pnInv.Visible)
                {
                    strIcmResourceType = "icm_mas_resource_group";

                    strIcmResourceSeq = ddlResourceGrp.SelectedValue;
                }

                string strBgmExpSeq = expCtrl.Insert(txtCode.Text, txtName.Text, txtDescr.Text, expType, parent
                    , hdExpGrpSeq.Text, ddlBgmExpGrpSeqReal.SelectedValue
                    , strIcmResourceType, strIcmResourceSeq, txtGFMISCode.Text);

                foreach (GridDataItem item in RadGridBgmExpenseSource.Items)
                {
                    if (item.Selected)
                    {
                        string strBgmSourceSeq = item["value"].Text;
                        exp.InsertExpSource(strBgmExpSeq, strBgmSourceSeq, new SsMng().GetUss(SsMng.SsUserType.EmpSeq));
                    }
                }

                LoadDataGrid();
                LoadTree();
                ChangeMode(Main.EditMode.View);
            }
            else
                RadManager1.Alert("กรุณาเลือกกลุ่มข้อมูล");
        }

        protected void AddNew_Click(object sender, EventArgs e)
        {
            ChangeMode(Main.EditMode.AddNew);
        }

        protected void Cancel_Click(object sender, EventArgs e)
        {
            ChangeMode(Main.EditMode.View);
        }

        protected void Save_Edit_Click(object sender, EventArgs e)
        {
            if (hdExpGrpSeq.Text.Length > 0 && ddlBgmExpGrpSeqReal.SelectedValue.Length > 0)
            {
                string parent = (hdSeqParent.Text.Length > 0) ? hdSeqParent.Text : "";
                string strIcmResourceType = null;
                string strIcmResourceSeq = null;

                if (pnInv.Visible)
                {
                    strIcmResourceType = "icm_mas_resource_group";
                    //strIcmResourceSeq = lbResourceSeq.Value;
                    //string[] strArray = strIcmResourceSeq.Split('-');
                    //strIcmResourceSeq = strArray[strArray.Length - 1];

                    strIcmResourceSeq = ddlResourceGrp.SelectedValue;
                }

                expCtrl.Update(hdSeq.Text, txtCode.Text, txtName.Text, txtDescr.Text, expType, parent
                    , hdExpGrpSeq.Text, ddlBgmExpGrpSeqReal.SelectedValue, strIcmResourceType, strIcmResourceSeq, txtGFMISCode.Text);

                foreach (GridDataItem item in RadGridBgmExpenseSource.Items)
                {
                    string strBgmExpSourceSeq = main.WebString(item["bgm_exp_source_seq"].Text);

                    if (item.Selected)
                    {
                        if (string.IsNullOrEmpty(strBgmExpSourceSeq))
                        {
                            string strBgmSourceSeq = item["value"].Text;
                            exp.InsertExpSource(hdSeq.Text, strBgmSourceSeq, new SsMng().GetUss(SsMng.SsUserType.EmpSeq));
                        }
                    }
                    else
                    {
                        if (!string.IsNullOrEmpty(strBgmExpSourceSeq))
                        {
                            string strBgmSourceSeq = item["value"].Text;
                            exp.DeleteExpSource(strBgmExpSourceSeq, new SsMng().GetUss(SsMng.SsUserType.EmpSeq));
                        }
                    }
                }

                LoadDataGrid();
                LoadTree();
                ChangeMode(Main.EditMode.View);
            }
        }

        protected void Delete_Click(object sender, EventArgs e)
        {
            int nRowSelected = 0;
            if (panelGrid.Visible)
            {
                foreach (GridDataItem data in Grid.MasterTableView.GetSelectedItems())
                {
                    expCtrl.Delete(data.OwnerTableView.DataKeyValues[data.ItemIndex]["Sequence"].ToString());

                    nRowSelected++;
                }
            }
            else
            {
                expCtrl.Delete(hdSeq.Text);
            }
            LoadDataGrid();
            LoadTree();
            ChangeMode(Main.EditMode.View);
        }

        protected void Grid_ItemCommand(object source, GridCommandEventArgs e)
        {
            if (e.CommandName == "TargetClick")
            {
                IList<ExpenseInfo> expList = expCtrl.Search(((Label)e.Item.FindControl("targetSequence")).Text, expType);
                if (expList.Count > 0)
                {
                    hdSeq.Text = expList[0].Sequence.ToString();
                    txtCode.Text = expList[0].Code;
                    txtName.Text = expList[0].Name;
                    txtDescr.Text = expList[0].Description;
                    txtGFMISCode.Text = expList[0].Gfmis_code;
                    ddlBgmExpGrpSeqReal.SelectedValue = expList[0].ExpenseGroupReal.Sequence.ToString();
                    lbBgmExpGrpSeqReal.Value = expList[0].ExpenseGroupReal.Sequence.ToString();

                    RadGridBgmExpenseSource.DataSource = comboBLL.ListSourceCombo();
                    RadGridBgmExpenseSource.DataBind();
                    //RadGridBgmExpenseSource.ClientSettings.Selecting.AllowRowSelect = false;

                    DataTable dtb = exp.GetExpenseSourceData(hdSeq.Text);

                    foreach (DataRow dr in dtb.Rows)
                    {
                        string strBgmExpSourceSeq = dr["bgm_exp_source_seq"].ToString();
                        string strBgmSourceSeq = dr["bgm_source_seq"].ToString();

                        foreach (GridDataItem item in RadGridBgmExpenseSource.Items)
                        {
                            if (strBgmSourceSeq == item["value"].Text)
                            {
                                item.Selected = true;
                                item["bgm_exp_source_seq"].Text = strBgmExpSourceSeq;
                            }
                        }
                    }

                    if (expList[0].Icm_resource_seq.ToString().Length > 0)
                    {
                        chkInv.Checked = true;
                        chkInv_CheckedChanged(null, null);
                        pnInv.Visible = true;
                        string strRes = expList[0].Icm_resource_seq.ToString();
                        
                        ddlResourceGrp.SelectedValue = expList[0].Icm_resource_seq.ToString();
                    }
                    else
                    {
                        chkInv.Checked = false;
                        pnInv.Visible = false;
                    }

                    if (expList[0].Parent != null)
                    {
                        IList<ExpenseInfo> expParentList = expCtrl.Search(expList[0].Parent.Sequence.ToString(), expType);
                        hdSeqParent.Text = expParentList[0].Sequence.ToString();
                    }
                    ChangeMode(Main.EditMode.Edit);
                }
            }
            else
            {
                Grid.DataSource = Session["dtEx"];
                ChangeMode(Main.EditMode.View);
            }
        }

        protected void tView_NodeClick(object sender, RadTreeNodeEventArgs e)
        {
            string[] type = e.Node.Value.Split('-');
            //hdSeq.Text = e.Node.Value;
            hdLevel.Text = e.Node.Level.ToString();
            if (type[0].ToString() == "GROUP")
            {
                hdSeqParent.Text = "";
                Grid.DataSource = expCtrl.Search("", "", "", "", "", null, type[1].ToString(), "");
                hdExpGrpSeq.Text = type[1];
                hBgmExpGrpSeq.Value = type[1];
            }
            else if (type[0].ToString() == "EXPENSE")
            {
                hdSeqParent.Text = type[1];
                IList<ExpenseInfo> expList = expCtrl.Search("", "", "", "", "", type[1].ToString(), "", "");
                Grid.DataSource = expList;
                if (expList == null || expList.Count == 0)
                {
                    expList = expCtrl.Search(type[1].ToString(), "", "", "", "", null, "", "");
                }
                else
                {
                    hdExpGrpSeq.Text = expList[0].ExpenseGroup.Sequence.ToString();
                    hBgmExpGrpSeq.Value = expList[0].ExpenseGroup.Sequence.ToString();
                    ddlBgmExpGrpSeqReal.SelectedValue = expList[0].ExpenseGroupReal.Sequence.ToString();
                    //ViewState["BgmExpGrpSeqReal"] = ddlBgmExpGrpSeqReal.SelectedValue;
                }
                ddlBgmExpGrpSeqReal_SelectedIndexChanged(null, null);
            }
            Grid.DataBind();
            //cmdFac.GridCommand(panelList, panelGrid, CmdCtrl.FindControl("panelCommand"));
            Session["dtEx"] = Grid.DataSource;

            //======================= เช็คว่าเป็น Level สุดท้ายรึไม่ ====================
            bool bCanAddNew = true;

            if (e.Node.Level > 2 && (hdExpGrpSeq.Text == "1" || hdExpGrpSeq.Text == "2" || hdExpGrpSeq.Text == "3" || hdExpGrpSeq.Text == "5"))
            {
                bCanAddNew = false;
            }
            else if (e.Node.Level > 4 && (hdExpGrpSeq.Text == "4"))
            {
                bCanAddNew = false;
            }

            pnlControl.Enabled = bCanAddNew;

            //======================= เช็คว่าสามารถระบุ bgm_exp_grp_id_real ได้ ====================
            if (hdExpGrpSeq.Text == "1" || hdExpGrpSeq.Text == "2" || hdExpGrpSeq.Text == "3")
            {
                pnExpGrpReal.Visible = false;
                ddlBgmExpGrpSeqReal.SelectedValue = hdExpGrpSeq.Text;
            }
            else
            {
                pnExpGrpReal.Visible = true;
                ddlBgmExpGrpSeqReal.SelectedValue = hdExpGrpSeq.Text;
            }

            if (hdExpGrpSeq.Text != "4")
            {
                switch (e.Node.Level)
                {
                    case 3:
                        //labelNodeTypeInfo.Text = "ข้อมูลหมวดรายจ่าย/รายการรายจ่าย/ค่าใช้จ่าย/ค่าใช้จ่ายย่อย";
                        labelNodeTypeInfo1.Text = "ข้อมูลหมวดรายจ่าย/รายการรายจ่าย/ค่าใช้จ่าย/ค่าใช้จ่ายย่อย";
                        labelNodeTypeInfo2.Text = "ข้อมูลหมวดรายจ่าย/รายการรายจ่าย/ค่าใช้จ่าย/ค่าใช้จ่ายย่อย";
                        break;
                    case 2:
                        //labelNodeTypeInfo.Text = "ข้อมูลหมวดรายจ่าย/รายการรายจ่าย/ค่าใช้จ่าย";
                        labelNodeTypeInfo1.Text = "ข้อมูลหมวดรายจ่าย/รายการรายจ่าย/ค่าใช้จ่าย";
                        labelNodeTypeInfo2.Text = "ข้อมูลหมวดรายจ่าย/รายการรายจ่าย/ค่าใช้จ่าย";
                        break;
                    case 1:
                        //labelNodeTypeInfo.Text = "ข้อมูลหมวดรายจ่าย/รายการรายจ่าย";
                        labelNodeTypeInfo1.Text = "ข้อมูลหมวดรายจ่าย/รายการรายจ่าย";
                        labelNodeTypeInfo2.Text = "ข้อมูลหมวดรายจ่าย/รายการรายจ่าย";
                        break;
                    case 0:
                        //labelNodeTypeInfo.Text = "ข้อมูลหมวดรายจ่าย";
                        labelNodeTypeInfo1.Text = "ข้อมูลหมวดรายจ่าย";
                        labelNodeTypeInfo2.Text = "ข้อมูลหมวดรายจ่าย";
                        break;
                    default:
                        //labelNodeTypeInfo.Text = "Default";
                        labelNodeTypeInfo1.Text = "Default";
                        labelNodeTypeInfo2.Text = "Default";
                        break;
                }
            }
            else
            {
                switch (e.Node.Level)
                {
                    case 5:
                        //labelNodeTypeInfo.Text = "ข้อมูลหมวดรายจ่าย/รายการรายจ่าย/ค่าใช้จ่าย/ค่าใช้จ่ายย่อย";
                        labelNodeTypeInfo1.Text = "ข้อมูลหมวดรายจ่าย/รายการรายจ่าย/ค่าใช้จ่าย/ค่าใช้จ่ายย่อย";
                        labelNodeTypeInfo2.Text = "ข้อมูลหมวดรายจ่าย/รายการรายจ่าย/ค่าใช้จ่าย/ค่าใช้จ่ายย่อย";
                        break;
                    case 4:
                        //labelNodeTypeInfo.Text = "ข้อมูลหมวดรายจ่าย/รายการรายจ่าย/ค่าใช้จ่าย";
                        labelNodeTypeInfo1.Text = "ข้อมูลหมวดรายจ่าย/รายการรายจ่าย/ค่าใช้จ่าย";
                        labelNodeTypeInfo2.Text = "ข้อมูลหมวดรายจ่าย/รายการรายจ่าย/ค่าใช้จ่าย";
                        break;
                    case 3:
                        //labelNodeTypeInfo.Text = "ข้อมูลหมวดรายจ่าย/รายการรายจ่าย";
                        labelNodeTypeInfo1.Text = "ข้อมูลหมวดรายจ่าย/รายการรายจ่าย";
                        labelNodeTypeInfo2.Text = "ข้อมูลหมวดรายจ่าย/รายการรายจ่าย";
                        break;
                    case 2:
                        //labelNodeTypeInfo.Text = "ข้อมูลหมวดรายจ่าย";
                        labelNodeTypeInfo1.Text = "ข้อมูลหมวดรายจ่าย";
                        labelNodeTypeInfo2.Text = "ข้อมูลหมวดรายจ่าย";
                        break;
                    case 1:
                        //labelNodeTypeInfo.Text = "ลักษณะงบรายจ่าย";
                        labelNodeTypeInfo1.Text = "ลักษณะงบรายจ่าย";
                        labelNodeTypeInfo2.Text = "ลักษณะงบรายจ่าย";
                        break;
                    case 0:
                        //labelNodeTypeInfo.Text = "ประเภทของเงินอุดหนุน";
                        labelNodeTypeInfo1.Text = "ประเภทของเงินอุดหนุน";
                        labelNodeTypeInfo2.Text = "ประเภทของเงินอุดหนุน";
                        break;
                    default:
                        //labelNodeTypeInfo.Text = "Default";
                        labelNodeTypeInfo1.Text = "Default";
                        labelNodeTypeInfo2.Text = "Default";
                        break;
                }
            }

            ViewState["NodeValue"] = e.Node.Value;
        }

        protected void RadManager1_AjaxRequest(object sender, Telerik.Web.UI.AjaxRequestEventArgs e)
        {
            hdSeq.Text = e.Argument;
        }

        protected void chkInv_CheckedChanged(object sender, EventArgs e)
        {
            pnInv.Visible = chkInv.Checked;

            if (chkInv.Checked)
            {
                string strIcmResTypeSeq = (ddlBgmExpGrpSeqReal.SelectedValue == "2" ? "1" : "2, 3, 4");
                ddlResourceGrp.DataSource = comboBLL.ListResourceGrp(strIcmResTypeSeq);
                ddlResourceGrp.DataBind();
            }
        }

        protected void ddlBgmExpGrpSeqReal_SelectedIndexChanged(object sender, RadComboBoxSelectedIndexChangedEventArgs e)
        {
            string strBgmExpGrpSeqReal = ddlBgmExpGrpSeqReal.SelectedValue;

            if (strBgmExpGrpSeqReal == "1" || strBgmExpGrpSeqReal == "4" || strBgmExpGrpSeqReal == "5")
            {
                pnInvCheck.Visible = false;
                chkInv.Checked = false;
                chkInv_CheckedChanged(null, null);
            }
            else if (strBgmExpGrpSeqReal == "3")
            {
                pnInvCheck.Visible = true;
                chkInv.Checked = true;
                chkInv_CheckedChanged(null, null);
            }
            else if (strBgmExpGrpSeqReal == "2")
            {
                pnInvCheck.Visible = true;
                chkInv.Checked = false;
                chkInv_CheckedChanged(null, null);
            }
        }
    }
}
